From: David Härdeman Date: Mon, 6 Oct 2025 14:45:38 +0000 (+0200) Subject: dhcpv4: some minor cleanups post-iovec X-Git-Url: http://git.openwrt.org/%22https:/collectd.org//%22/%22https:/collectd.org/%22?a=commitdiff_plain;h=be68f423c528233111dfec13456c46077ee489fb;p=project%2Fodhcpd.git dhcpv4: some minor cleanups post-iovec Do some cleanups, remove some magic numbers, make sure structs are defined with the members in their actual order and without missing members. Signed-off-by: David Härdeman Link: https://github.com/openwrt/odhcpd/pull/278 Signed-off-by: Álvaro Fernández Rojas --- diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 70b36be..8d127e0 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -161,6 +161,7 @@ static void dhcpv4_fr_send(struct dhcp_assignment *a) .htype = ARPHRD_ETHER, .hlen = ETH_ALEN, .hops = 0, + .xid = 0, .secs = 0, .flags = 0, .ciaddr = { INADDR_ANY }, @@ -664,15 +665,19 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, /* Reply variables */ struct dhcpv4_message reply = { .op = DHCPV4_OP_BOOTREPLY, - .htype = req->htype, - .hlen = req->hlen, + .htype = ARPHRD_ETHER, + .hlen = ETH_ALEN, .hops = 0, .xid = req->xid, .secs = 0, .flags = req->flags, .ciaddr = { INADDR_ANY }, - .giaddr = req->giaddr, + .yiaddr = { INADDR_ANY }, .siaddr = iface->dhcpv4_local, + .giaddr = req->giaddr, + .chaddr = { 0 }, + .sname = { 0 }, + .file = { 0 }, .cookie = htonl(DHCPV4_MAGIC_COOKIE), }; struct dhcpv4_option_u8 reply_msg = { @@ -788,7 +793,9 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, /* FIXME: would checking the magic cookie value here break any clients? */ if (len < offsetof(struct dhcpv4_message, options) || - req->op != DHCPV4_OP_BOOTREQUEST || req->hlen != ETH_ALEN) + req->op != DHCPV4_OP_BOOTREQUEST || + req->htype != ARPHRD_ETHER || + req->hlen != ETH_ALEN) return; debug("Got DHCPv4 request on %s", iface->name); @@ -798,8 +805,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, return; } - memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr)); - struct dhcpv4_option *opt; dhcpv4_for_each_option(req->options, (uint8_t *)data + len, opt) { switch (opt->code) { @@ -855,6 +860,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, } switch (req_msg) { + case DHCPV4_MSG_INFORM: + break; case DHCPV4_MSG_DISCOVER: _fallthrough; case DHCPV4_MSG_REQUEST: @@ -866,8 +873,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, &req_leasetime, req_hostname, req_hostname_len, req_accept_fr, &incl_fr_opt, &fr_serverid); break; - case DHCPV4_MSG_INFORM: - break; default: return; } @@ -909,8 +914,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, reply_serverid.data = fr_serverid; if (req->ciaddr.s_addr && - ((iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr) != - (req->ciaddr.s_addr & iface->dhcpv4_mask.s_addr))) + ((iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr) != + (req->ciaddr.s_addr & iface->dhcpv4_mask.s_addr))) req->ciaddr.s_addr = INADDR_ANY; } break; @@ -934,10 +939,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, reply_opts[reply_opts_len++] = DHCPV4_OPT_AUTHENTICATION; reply_opts[reply_opts_len++] = DHCPV4_OPT_SEARCH_DOMAIN; reply_opts[reply_opts_len++] = DHCPV4_OPT_FORCERENEW_NONCE_CAPABLE; - - if (a) - reply.yiaddr.s_addr = a->addr; - memcpy(&reply_opts[reply_opts_len], req_opts, req_opts_len); reply_opts_len += req_opts_len; @@ -1148,6 +1149,11 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len, } } + if (a) + reply.yiaddr.s_addr = a->addr; + + memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr)); + dhcpv4_set_dest_addr(iface, reply_msg.data, req, &reply, src_addr, &dest_addr); /* FIXME: check for DHCPV4_MIN_PACKET_SIZE */